package main

import (
	"fmt"
)

type treeNode struct {
	value int
	left,right *treeNode
}


//工chang函数返回一个结构的地址 不用考虑去哪里分配 结构是在堆上还是在栈上
//new出来的都会存在堆上java所以有垃圾回收机制
func createNode(value int) *treeNode{
	return &treeNode{value:value}
}

type myTreeNode struct {
	node *treeNode
}

func (myNode *myTreeNode) postOrde(){
	if myNode==nil||myNode.node==nil{
		return
	}

	left:=myTreeNode{myNode.node.left}
	left.postOrde()

	right:=myTreeNode{myNode.node.right}
	right.postOrde()
	myNode.node.prinT()
}

//结构定义方法
func (node treeNode)prinT(){
	fmt.Println("nodeValue:",node.value)
}

func (node *treeNode) setValue(value int){
	if node==nil{
		fmt.Println("你的节点node是null啊啊啊")
		return
	}
	node.value=value
}


func (node *treeNode)traverse(){
	if node==nil{
		return
	}
	//中序遍历
	node.left.traverse()
	node.prinT()
	node.right.traverse()
}

func main() {
	//创建treenode
	var root treeNode

	root=treeNode{value:3}
	root.left=&treeNode{}
	root.right=&treeNode{5,nil,nil}

	root.right.left=new(treeNode)
	root.left.right=createNode(2)

	root.right.left.setValue(4)

	root.traverse()

	fmt.Println()
	myRoot:=myTreeNode{&root}
	myRoot.postOrde()

//如果要改变内容的用指针接受者
//如果结构过大也是要考虑指针接受者
//一致性：如果都是指针接受者一般都用指针接受
//只有go语言才有值接受者

}
